#include "Usuario.h"

/**
 * \brief Construtor
 *
 * Instancia a classe Usuario e seta o ID do usuário como -1 (indefinido)
 */
Usuario::Usuario()
{
	ID = -1;
}

/**
 * Destrutor
 */
Usuario::~Usuario()
{
}

/*!
* \brief Retorna Interesses
*
* Método que retorna todos os interesses
* do usuário
*
* \return vector<Interesse> Um vetor com todos os interesses
*
*/
vector<Interesse> Usuario::GetInteresses()
{
	return interesses;
}

 /*!
 * \brief Retorna Interesse por posição
 *
 * Método para selecionar um determinado interesse de
 * acordo com a sua posição no vetor
 *
 * \param pos posição do interesse
 *
 * \return Interesse Interesse selecionado
 *
 */
Interesse Usuario::GetInteresse(int pos)
{
	return interesses.at(pos);
}

/**
* \brief Adiciona um interesse ao Usuário
*
* Método que adiciona um interesse ao vetor de
* interesses do Usuario
*
* \param it Interesse a ser cadastrado
*/
void Usuario::AdicionaInteresse(Interesse it)
{
	interesses.push_back(it);
}

/**
 * \brief Grava os interesses do usuário no arquivo
 *
 * Lê o vetor de interesses do usuário e atualiza o arquivo
 * de texto de interesses.
 */
void Usuario::GravaInteresses()
{
	ofstream outtmp("./dados/InteressesTmp.txt", ios_base::trunc);
	ofstream out;
	ifstream intmp;
	ifstream in("./dados/Interesses.txt");
	string linha;

	if(!in) {

		cerr << endl << "Erro ao abrir arquivo de interesses!";
		return;
	}

	while(getline(in, linha)) {
		istringstream iss(linha);
		string coluna;

		const char delim(';');
		int usuarioID;

		getline(iss, coluna, delim);
		usuarioID = atoi(coluna.c_str());

		if (usuarioID != GetID()) {
			outtmp << linha << endl;
		}
	}
	outtmp.close();
	in.close();

	intmp.open("./dados/InteressesTmp.txt");
	out.open("./dados/Interesses.txt", ios_base::trunc);

	for(unsigned int i=0; i<interesses.size(); i++) {
		out << GetID() << ";" << interesses.at(i).GetTipo() << ";" << interesses.at(i).GetValor() << endl;
	}

	while(getline(intmp, linha)) {
		out << linha << endl;
	}

	out.close();
	intmp.close();
}

/**
 * \brief Carrega os interesses do usuário no vetor de interesses
 *
 * Lê o arquivo de interesses e grava as informações referentes ao
 * usuário corrente no vetor de interesses do usuário
 */
void Usuario::CarregaInteresses()
{
	fstream in("./dados/Interesses.txt");
	string linha;

	if(!in) {
		cerr << endl << "Erro ao abrir arquivo de interesses!";
		return;
	}

	interesses.clear();

	while(getline(in, linha)) {
		istringstream iss(linha);
		string coluna;
		Interesse it;

		const char delim(';');
		int usuarioID;

		getline(iss, coluna, delim);
		usuarioID = atoi(coluna.c_str());

		if (usuarioID == GetID()) {
			getline(iss, coluna, delim);
			it.SetTipo(atoi(coluna.c_str()));

			getline(iss, coluna, delim);
			it.SetValor(coluna);

			interesses.push_back(it);
		}
	}
}

/**
 * \brief Retorna o vetor de livros de interesses
 *
 * Retorna o vetor de livros de interesse do usuário corrente
 *
 * \return vector<Livro> Um vetor de livros de interresses
 */
vector<Livro> Usuario::GetLivrosDeInteresses()
{
	return livros;
}

/**
 * \brief Retorna um determinado livro de interesse
 *
 * Retorna um determinado livro de interesse, baseado na
 * sua posição dentro do vetor
 *
 * \param pos A posição dentro do vetor
 * \return Livro O livro correspondente à posição
 */
Livro Usuario::GetLivroDeInteresse(int pos)
{
	return livros.at(pos);
}


/**
 * \brief Insere um livro no vetor de livros de interesse
 *
 * Insere um livro no vetor de livros de interesse do usuário corrente
 *
 * \param li O Livro a ser adicionado
 */
void Usuario::AdicionaLivroDeInteresse(Livro li)
{
	livros.push_back(li);
}


/**
 * \brief Grava os livros interesses do usuário no arquivo
 *
 * Lê o vetor de livros de  interesses do usuário e atualiza o arquivo
 * de texto de livros de interesses.
 */
void Usuario::GravaLivrosDeInteresses()
{
	ofstream outtmp("./dados/LivrosDeInteressesTmp.txt", ios_base::trunc);
	ofstream out;
	ifstream intmp;
	ifstream in("./dados/LivrosDeInteresses.txt");
	string linha;

	if(!in) {
		cerr << endl << "Erro ao abrir arquivo de livros de interesses!";
		return;
	}

	while(getline(in, linha)) {
		istringstream iss(linha);
		string coluna;

		const char delim(';');
		int usuarioID;

		getline(iss, coluna, delim);
		usuarioID = atoi(coluna.c_str());

		if (usuarioID != GetID()) {
			outtmp << linha << endl;
		}
	}

	outtmp.close();
	in.close();

	intmp.open("./dados/LivrosDeInteressesTmp.txt");
	out.open("./dados/LivrosDeInteresses.txt", ios_base::trunc);

	for(unsigned int i=0; i<livros.size(); i++) {
		out << GetID() << ";" << livros.at(i).GetID() << endl;
	}

	while(getline(intmp, linha)) {
		out << linha << endl;
	}

	out.close();
	intmp.close();
}

/**
 * \brief Carrega os livros de interesses do usuário no vetor de livros de interesses
 *
 * Lê o arquivo de livros interesses e grava as informações referentes ao
 * usuário corrente no vetor de livros interesses do usuário
 *
 * \return vector<long> Um vetor com os IDs dos livros de interesse
 */

vector<long> Usuario::CarregaLivrosDeInteresses()
{
	fstream in("./dados/LivrosDeInteresses.txt");
	string linha;
	vector<long> IDs;

	if(!in) {
		throw "Erro ao abrir arquivo de livros de interesses!";
	}

	livros.clear();

	while(getline(in, linha)) {
		istringstream iss(linha);
		string coluna;
		Livro l;

		const char delim(';');
		int usuarioID;

		getline(iss, coluna, delim);
		usuarioID = atoi(coluna.c_str());

		if (usuarioID == GetID()) {
			getline(iss, coluna, delim);
			IDs.push_back(atol(coluna.c_str()));
		}
	}
	return IDs;
}

/**
 * \brief Retorna o ID do usuário
 *
 * \return long O ID do usuário
 */
long Usuario::GetID()
{
	return ID;
}
/**
 * \brief Seta o login do usuário
 *
 * \param l O login do usuário
 */
void Usuario::SetLogin( string l )
{
	Login = l;
}

/**
 * \brief Seta a senha do usuário
 *
 * \param s A senha do usuário
 */
void Usuario::SetSenha( string s )
{
	Senha = s;
}

/**
 * \brief Seta o ID do usuário
 *
 * \param id O ID do usuário
 */
void Usuario::SetID( long id)
{
	ID = id;
}

/**
 * \brief Retorna o login do usuário
 *
 * \return Login O login do usuário
 */
string Usuario::GetLogin()
{
	return Login;
}


